package com.sky.controller.admin;

import com.sky.dto.VisaMaterialRequirementDTO;
import com.sky.dto.VisaMaterialRequirementPageQueryDTO;
import com.sky.entity.VisaMaterialRequirement;
import com.sky.entity.VisaProduct;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.VisaMaterialRequirementService;
import com.sky.service.VisaProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import com.sky.annotation.IgnoreToken;

@RestController
@RequestMapping("/admin/visa-material-requirement")
@Slf4j
@Api(tags = "签证材料要求相关接口")
@CrossOrigin
public class VisaMaterialRequirementController {
    @Autowired
    private VisaMaterialRequirementService visaMaterialRequirementService;
    
    @Autowired
    private VisaProductService visaProductService;

    /**
     * 测试接口
     * @return
     */
    @GetMapping("/test")
    @ApiOperation("测试接口")
    public Result<String> test() {
        log.info("测试接口被调用");
        return Result.success("后端服务正常运行");
    }

    /**
     * 新增签证材料要求
     * @param visaMaterialRequirementDTO
     * @return
     */
    @PostMapping("/add")
    @ApiOperation(value = "新增签证材料要求")
    public Result<String> insert(@RequestBody VisaMaterialRequirementDTO visaMaterialRequirementDTO) {
        log.info("新增签证材料要求,参数:{}", visaMaterialRequirementDTO);
        visaMaterialRequirementService.insert(visaMaterialRequirementDTO);
        return Result.success();
    }

    /**
     * 修改签证材料要求
     * @param visaMaterialRequirementDTO
     * @return
     */
    @PutMapping
    @ApiOperation(value = "修改签证材料要求")
    public Result<String> update(@RequestBody VisaMaterialRequirementDTO visaMaterialRequirementDTO) {
        log.info("修改签证材料要求,参数:{}", visaMaterialRequirementDTO);
        visaMaterialRequirementService.update(visaMaterialRequirementDTO);
        return Result.success();
    }

    /**
     * 删除签证材料要求
     * @param id
     * @return
     */
    @DeleteMapping
    @ApiOperation(value = "删除签证材料要求")
    public Result<String> delete(Long id) {
        log.info("删除签证材料要求,参数:{}", id);
        visaMaterialRequirementService.delete(id);
        return Result.success();
    }

    /**
     * 分页查询签证材料要求
     * @param visaMaterialRequirementPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("分页查询签证材料要求")
    public Result<PageResult> page(VisaMaterialRequirementPageQueryDTO visaMaterialRequirementPageQueryDTO) {
        log.info("查询签证材料要求列表,参数:{}", visaMaterialRequirementPageQueryDTO);
        PageResult pageResult = visaMaterialRequirementService.page(visaMaterialRequirementPageQueryDTO);
        return Result.success(pageResult);
    }

    /**
     * 根据ID查询签证材料要求
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据ID查询签证材料要求")
    public Result<VisaMaterialRequirement> selectById(@PathVariable Long id) {
        log.info("根据ID查询签证材料要求,参数:{}", id);
        VisaMaterialRequirement visaMaterialRequirement = visaMaterialRequirementService.selectById(id);
        return Result.success(visaMaterialRequirement);
    }

    /**
     * 根据产品名称查询签证材料要求列表
     * @param productName
     * @return
     */
    @GetMapping("/product/{productName}")
    @ApiOperation("根据产品名称查询签证材料要求列表")
    public Result<List<VisaMaterialRequirement>> selectByProductName(@PathVariable String productName) {
        log.info("根据产品名称查询签证材料要求列表,参数:{}", productName);
        List<VisaMaterialRequirement> list = visaMaterialRequirementService.selectByProductName(productName);
        return Result.success(list);
    }

    /**
     * 根据产品名称和用户类型查询签证材料要求列表
     * @param productName
     * @param userType
     * @return
     */
    @GetMapping("/product/{productName}/user-type/{userType}")
    @ApiOperation("根据产品名称和用户类型查询签证材料要求列表")
    public Result<List<VisaMaterialRequirement>> selectByProductNameAndUserType(@PathVariable String productName, @PathVariable String userType) {
        log.info("根据产品名称和用户类型查询签证材料要求列表,参数:productName:{},userType:{}", productName, userType);
        List<VisaMaterialRequirement> list = visaMaterialRequirementService.selectByProductNameAndUserType(productName, userType);
        return Result.success(list);
    }

    /**
     * 获取签证产品列表（用于下拉选择）
     * @return
     */
    @GetMapping("/visa-products")
    @ApiOperation("获取签证产品列表（用于下拉选择）")
    public Result<List<VisaProduct>> getVisaProducts() {
        log.info("获取签证产品列表");
        List<VisaProduct> list = visaProductService.getAllEnabledProducts();
        return Result.success(list);
    }

    /**
     * 小程序专用：根据产品名称查询签证材料要求列表
     * @param productName
     * @return
     */
    @GetMapping("/miniapp/product/{productName}")
    @ApiOperation("小程序专用：根据产品名称查询签证材料要求列表")
    public Result<List<VisaMaterialRequirement>> selectByProductNameForMiniapp(@PathVariable String productName) {
        log.info("小程序查询签证材料要求列表,参数:{}", productName);
        List<VisaMaterialRequirement> list = visaMaterialRequirementService.selectByProductName(productName);
        return Result.success(list);
    }

    /**
     * 小程序专用：根据产品名称和用户类型查询签证材料要求列表
     * @param productName
     * @param userType
     * @return
     */
    @GetMapping("/miniapp/product/{productName}/user-type/{userType}")
    @ApiOperation("小程序专用：根据产品名称和用户类型查询签证材料要求列表")
    public Result<List<VisaMaterialRequirement>> selectByProductNameAndUserTypeForMiniapp(@PathVariable String productName, @PathVariable String userType) {
        log.info("小程序查询签证材料要求列表,参数:productName:{},userType:{}", productName, userType);
        List<VisaMaterialRequirement> list = visaMaterialRequirementService.selectByProductNameAndUserType(productName, userType);
        return Result.success(list);
    }

    /**
     * 小程序专用：根据产品ID查询签证材料要求列表
     * @param productId
     * @return
     */
    @GetMapping("/miniapp/product-id/{productId}")
    @ApiOperation("小程序专用：根据产品ID查询签证材料要求列表")
    @IgnoreToken
    public Result<List<VisaMaterialRequirement>> selectByProductIdForMiniapp(@PathVariable Long productId) {
        log.info("小程序查询签证材料要求列表,参数:productId:{}", productId);
        List<VisaMaterialRequirement> list = visaMaterialRequirementService.selectByProductId(productId);
        return Result.success(list);
    }

    /**
     * 小程序专用：根据产品ID和用户类型查询签证材料要求列表
     * @param productId
     * @param userType
     * @return
     */
    @GetMapping("/miniapp/product-id/{productId}/user-type/{userType}")
    @ApiOperation("小程序专用：根据产品ID和用户类型查询签证材料要求列表")
    @IgnoreToken
    public Result<List<VisaMaterialRequirement>> selectByProductIdAndUserTypeForMiniapp(@PathVariable Long productId, @PathVariable String userType) {
        log.info("小程序查询签证材料要求列表,参数:productId:{},userType:{}", productId, userType);
        List<VisaMaterialRequirement> list = visaMaterialRequirementService.selectByProductIdAndUserType(productId, userType);
        return Result.success(list);
    }
}
